package com.hsc.www;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;

//@HystrixCommand 加到服务的接口方法上，可以对接口限流。
//        下面的代码，给服务的 /hello接口 加了hystrix线程隔离，并且限制并发为5。
//        当接口熔断或者降级时，会走降级方法，降级方法将异常信息返回，并且返回状态码 503

@RestController

public class MyController {


    //对controller层的接口做hystrix线程池隔离，可以起到限流的作用
//    @HystrixCommand(
//            threadPoolKey = "helloPool",//缺省为类名
//            commandKey = "helloCommand",//缺省为方法名
//            fallbackMethod = "fallbackMethod", //指定降级方法，在熔断和异常时会走降级方法
//            commandProperties = {
////                    超时时间,如果方法执行时间大于超时时间，将会熔断，即抛出Hystrix circuit short-circuited and is OPEN异常，并调用fallbackMethod指定的方法
//                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
//            },
//            threadPoolProperties = {
////                    并发数（缺省为10），当方法同时被调用的次数 大于 并发数时，多出的调用会被拒绝，即抛出RejectedExecutionException :Task java.util.concurrent.FutureTask@5add13db rejected from java.util.concurrent.ThreadPoolExecutor@69479485[Running, pool size = 5, active threads = 5, queued tasks = 0, completed tasks = 0
////                    并调用fallbackMethod指定的方法
//                    @HystrixProperty(name = "coreSize", value = "12")
//            }
//    )

    @HystrixCommand(fallbackMethod = "fallbackMethod")
    @RequestMapping("/hello")
    public ResponseData hello(HttpServletResponse response) throws Exception{
        System.out.println("dddddddd"+System.currentTimeMillis());
        
                    Thread.sleep(500);

//        if (Math.random()<0.5d){
//            Thread.sleep(500);
//            System.out.println("eeeeeeee");
//
//        }else{
//            Thread.sleep(5*1000);
//            System.out.println("dddddddd");
//        }
        return new ResponseData(1, "success", "Hello World!");
    }

    /**
     * 降级方法，状态码返回503
     * 注意，降级方法的返回类型与形参要与原方法相同，可以多一个Throwable参数放到最后，用来获取异常信息
     */
    public ResponseData fallbackMethod(HttpServletResponse response, Throwable e) {
        response.setStatus(HttpStatus.SERVICE_UNAVAILABLE.value());
        e.printStackTrace();
        return new ResponseData(0, e.getClass().getName(), e.getMessage());

    }
}